package com.knowledge.plus.反射;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 反射demo
 *
 * @author PF.Tian
 * @since 2021/09/13
 */
public class ReflectDemo {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {

        /**
         * 获取GetReflectClass类的Class对象，并且创建GetReflectClass类实例
         */
        Class<?> targetClass = Class.forName("com.knowledge.plus.反射.GetReflectClass");
        GetReflectClass getReflectClass = (GetReflectClass) targetClass.newInstance();

        /**
         * 获取类中所有定义的方法
         */
        Method[] methods = targetClass.getDeclaredMethods();
        Arrays.stream(methods).forEach(m -> System.out.print(m.getName() + "\t"));
        System.out.println();

        /**
         * 获取指定方法并调用（传入参数）
         */
        Method publicMethod = targetClass.getDeclaredMethod("publicMethod", String.class);
        publicMethod.invoke(getReflectClass, "I'm a parameter to the publicMethod method");

        /**
         * 获取指定参数并对参数进行修改
         */
        Field field = targetClass.getDeclaredField("value");
        field.setAccessible(true);  // 为了对类中的参数进行修改我们取消安全检查
        field.set(getReflectClass, "优秀");

        /**
         * 调用 private 方法
         */
        Method privateMethod = targetClass.getDeclaredMethod("privateMethod");
        privateMethod.setAccessible(true);  // 为了调用private方法我们取消安全检查
        privateMethod.invoke(getReflectClass);
    }

}